package lojaVirtual.manterCadastro.dao;

import java.util.ArrayList;
import java.util.List;

import lojaVirtual.manterCadastro.pojo.Grupo;
import lojaVirtual.manterCadastro.pojo.Produto;
import lojaVirtual.manterCadastro.pojo.Subgrupo;

public class ProdutoDao implements IDao<Produto> {

	private final GenericDao<Produto> dao;

	public ProdutoDao() {

		dao = new GenericDao<Produto>(Produto.class);
	}

	@Override
	public void save(Produto e) {
		this.dao.save(e);

	}

	@Override
	public void delete(Produto e) {
		this.dao.delete(e);

	}

	@Override
	public Produto find(Integer id) {

		return this.dao.find(id);
	}

	@Override
	public List<Produto> list() {

		return this.dao.list("pro_nome");
	}

	public List<Produto> listByWhere(List<String> columns, List<String> values,
			String ordem) {

		String where = "";
		int count = 0;
		for (String column : columns) {

			if (count > 0)
				where += " and ";

			if (column.equals("pro_nome")) {
				where += " upper(" + column + ") like upper('%"
						+ values.get(count) + "%') ";
			} else {
				where += " " + column + "=" + values.get(count);
			}
			count++;

		}
		where += " ";

		return this.dao.list(ordem, where);
	}

	public List<Produto> listByCatGruSubgruWhere(List<String> columns,
			List<String> values, String ordem, int parent, int parentId) {

		String inGrupo = "";
		String inSubgrupo = "";
		

		switch (parent) {
		case 0:

			GrupoDao grupoDao = new GrupoDao();
			List<String> columnsGrupo = new ArrayList<String>();
			List<String> valuesGrupo = new ArrayList<String>();

			columnsGrupo.add("cat_id");
			valuesGrupo.add(String.valueOf(parentId));
			columnsGrupo.add("gru_ativo");
			valuesGrupo.add("true");

			List<Grupo> listGrupo = grupoDao.listByWhere(columnsGrupo,
					valuesGrupo, "gru_nome");

			int aux = 0;

			for (Grupo grupo : listGrupo) {

				if (aux > 0)
					inGrupo += ",";
				inGrupo += grupo.getGru_id();
				aux++;
			}

		case 1:

			SubgrupoDao subgrupoDao = new SubgrupoDao();
			List<String> columnsSubgrupo = new ArrayList<String>();
			List<String> valuesSubgrupo = new ArrayList<String>();

			columnsSubgrupo.add("gru_id");
			valuesSubgrupo.add( inGrupo.equals("") ? String.valueOf(parentId) : inGrupo );
			columnsSubgrupo.add("sub_ativo");
			valuesSubgrupo.add("true");

			List<Subgrupo> listSubgrupo = subgrupoDao.listByWhere(
					columnsSubgrupo, valuesSubgrupo, "sub_nome");

			int aux2 = 0;

			for (Subgrupo subgrupo : listSubgrupo) {

				if (aux2 > 0)
					inSubgrupo += ",";
				inSubgrupo += subgrupo.getSub_id();
				aux2++;
			}
			
			break;
			
		case 2:
			
			inSubgrupo = String.valueOf(parentId);

		}

		
		String where = "";
		int count = 0;
		for (String column : columns) {

			if (count > 0)
				where += " and ";
			

			if (column.equals("pro_nome")) {
				where += " upper(" + column + ") like upper('%"
						+ values.get(count) + "%') ";
			} else {
				where += " " + column + "=" + values.get(count);
			}
			count++;

		}
		
		if( !inSubgrupo.equals("")){
			where += " and sub_id in (" + inSubgrupo + ")";
		}
		
		where += " ";

		return this.dao.list(ordem, where);
	}

	@Override
	public List<Produto> listByStatus() {

		return this.dao.list("pro_nome", "pro_ativo = true");
	}

}
